색상, 폰트, 수식과 같은 서식 및 주석은 데이터 시각화에 큰 도움을 줄 수 있는 좋은 보조 기능이라고 할 수 있다. 데이터를 시각화 할 때 컬러를 잘 사용하면 전달하고자 하는 메시지를 더 쉽고 효과적으로 전달할 수 있다. 또한, 적절한 폰트를 선택하면 시각적으로 더 잘 다듬어진 결과물이라는 느낌을 준다. 마지막으로 수식과 같은 적절한 텍스트를 그래프 내에 삽입하면 필요한 보조 정보까지도 그림 하나에 모두 담아낼 수 있다.

색상

MATLAB의 컬러 표현 방법

MATLAB에서 색깔을 표현할 때 가장 많이 사용하는 방법은 3열 행렬에 RGB 각각의 3색의 농도를 [0, 1] 범위의 실수로 표현하는 것이다. 가령 빨간색이 100%, 초록, 파란색은 0% 농도를 가지는 색깔은 [1, 0, 0]으로 표시한다. 이렇듯 하나의 1행 3열의 벡터가 하나의 색깔을 표시하기 때문에 여러 색깔에 관한 정보를 한번에 표시하기 위해선 행벡터를 위아래로 쌓아주면 된다. 가령, 빨주노초파남보 일곱 색깔은 RGB로 다음과 같이 표현할 수 있다.

rainbow_palette = [...
    255, 0, 0;        % 빨
    255, 127, 0;      % 주
    255, 255, 0;      % 노
    0, 255, 0;        % 초
    0, 127, 255;      % 파
    0, 0, 255;        % 남
    127, 0, 255]/255; % 보

이 컬러들을 확인해보기 위해 아래와 같이 “imagesc” 함수를 이용해볼 수 있다.

figure;
imagesc([1:7]');
colormap(rainbow_palette)
xticks([])
yticks([])


미리 지정된 컬러맵

여러 컬러를 한꺼번에 표현하기 위해 위의 설명에서와 같이 여러 색깔의 RGB 컬러를 알아내서 임의의 컬러맵을 만들어낼 수 있겠으나, 이런 방식은 번거롭기도 하고 사용해야 하는 컬러의 수가 매우 많아지는 경우, 가령, 무지개 색을 100개로 샘플링하는 경우에는 일일히 RGB 값을 계산해 사용하는 것은 매우 번거로울 것이다. 이를 위해 MATLAB에서는 여러가지 컬러맵을 디폴트로 제공해주고 있으며 원하는 개수로 샘플링해줄 수 있게 지원해주고 있다. 예를 들어, 아래의 “parula” 컬러맵을 100개로 샘플링하고 싶다면 parula(100) 이라고 적으면 된다.


R2014b 버전 부터 디폴트 컬러캡은 “jet”에서 “parula”로 변경되었다. 만약, 디폴트 컬러맵을 “jet”으로 변경하고 싶다면 아래와 같은 명령어를 이용하면 된다. 아래의 명령어로 일어난 디폴트 컬러맵의 변경은 현재 실행중인 MATLAB Session에 한해서 적용된다.

set(groot, 'defaultFigureColormap', jet)

2차원 그래프에서 컬러 사용 팁

라인 기본 컬러 세팅

여러 데이터 셋을 2차원 그래프에 한번에 표시하다보면 컬러로 데이터의 종류를 구별해야 할 때가 있다. MATLAB에서는 “hold on” 기능을 이용해 여러 그래픽스 객체를 겹쳐 표시할 때 자동으로 색깔을 변경해준다.

x = linspace(0,10);
y1 = sin(x);
y2 = sin(x-0.5);
y3 = sin(x-1);
y4 = sin(x-1.5);

figure;
plot(x, y1,'LineWidth',2)
hold on
plot(x, y2,'LineWidth',2)
plot(x, y3,'LineWidth',2)
plot(x, y4,'LineWidth',2)
hold off


y1부터 y4까지의 라인 컬러를 보면 파랑, 빨강, 노랑, 보라색으로 표현할 수 있는 컬러의 순서로 서로 다른 라인들을 구별해놓은 것을 알 수 있다. 정확한 RGB 값을 확인하기 위해선 아래와 같은 명령어를 이용할 수 있다.

lines(4)


컬러 순서 변경하기

만약 기본 라인 컬러 순서를 쓰지 않고 다른 컬러 순서를 사용하기를 원한다면 “colororder” 함수를 이용할 수 있다.

newcolors = [0.83 0.14 0.14
             1.00 0.54 0.00
             0.47 0.25 0.80
             0.25 0.80 0.54];
         
colororder(newcolors)


이렇게 지정된 컬러 순서는 현재 적용된 figure에 한해서만 적용되므로 새로운 figure를 띄우면 기본 컬러 순서대로 돌아가게 된다.

3차원 그래프에서 컬러 사용 팁

3차원 그래프를 그릴 때에도 컬러는 중요한 정보를 담지하게 된다. 컬러를 이용해 높낮이를 표현할 수도 있지만, 3차원 공간의 정보가 아닌 또 다른 정보를 추가로 표현할 수도 있기 때문이다.

그래픽스 객체 핸들의 컬러 인수 수정 방법

그래픽스 객체 핸들의 “CData” 값을 조정하면 3차원 데이터에 표현된 컬러 값을 임의로 수정할 수 있다. 아래 예시에서는 $z = x + y$ 라는 함수에 대한 색깔을 x 값, y 값, z 값에 매칭시킨 예시를 보여주는 것이다.

clear; close all; clc;

[x, y] = meshgrid(linspace(-2, 2, 20));
z = x + y;

figure('position', [228, 380, 1650, 420])

subplot(1, 3, 1);
h1 = surf(x, y, z);
h1.CData = x;
xlabel('x-axis');
ylabel('y-axis');
zlabel('z-axis');

subplot(1, 3, 2);
h2 = surf(x, y, z);
h2.CData = y;
xlabel('x-axis');
ylabel('y-axis');
zlabel('z-axis');

subplot(1, 3, 3);
h3 = surf(x, y, z);
h3.CData = z;
xlabel('x-axis');
ylabel('y-axis');
zlabel('z-axis');


컬러바(colorbar)

가장 기본적으로 컬러바를 적극 이용하는 것이 좋다. 컬러바는 colorbar 명령어를 이용해 바로 띄울 수 있고 cbar = colorbar와 같이 써주면 “cbar”라는 변수를 컬러바에 관한 그래픽스 객체 핸들로 사용할 수도 있다. 아래의 예시를 확인해보자.

close all;
figure;
peaks(50);
colorbar;


만약, 컬러 값을 원점으로부터 떨어진 거리에 매핑한다고 해보자. 이럴 때에는 컬러바가 원점으로 부터 떨어진 거리가 얼마인지를 잘 표현해줄 수 있다.

close all;
figure;
peaks(50);
cbar = colorbar;
h = findobj('type', 'surf');

x = h.XData;
y = h.YData;
z = h.ZData;

h.CData = sqrt(x.^2 + y.^2);

title(cbar, 'dist from origin')

기성 colormap 으로 대체하는 방법

앞서 언급되었던 내용이지만 MATLAB의 기본 컬러맵은 “parula”이다. 만약 이것을 수정하고 싶다면 colormap 함수를 이용하여 수정할 수 있다. 다만 아래 예시에서는 “colormap” 함수에서 “gca”를 첫번째 인자로 넣었는데, 이렇게 컬러맵을 적용할 타겟 객체 핸들을 지정하지 않으면 기본적으로 하나의 figure에는 하나의 컬러맵이 적용되기 때문에 모든 Axis가 동일한 컬러맵을 사용하게 된다.

figure;
subplot(1, 2, 1);
peaks(50);
colormap(gca, "jet");

subplot(1, 2, 2);
peaks(50);
colormap(gca, "cool")


컬러바가 띄워져 있는 경우 컬러바를 우클릭하면 표준 컬러맵 중에서 선택할 수 있다.


colormap을 수동으로 수정하는 방법

간혹 표준 컬러맵을 사용하다가도 특정 색깔을 수정해야 할 필요가 있을 때가 있다. 그럴 때는 아래와 같이 컬러바를 만든 뒤 우클릭하여 “Open Colormap Editor”를 열어보자.


컬러맵 에디터는 아래와 같이 생겼는데 “Customize Colormap” > “Specify Color”에 들어가서 현재 컬러맵을 수정할 수 있다.


아래 그림에서는 가장 왼쪽에 있는 색깔을 흰색으로 수정하였다.


만약 수정한 컬러맵을 저장하고 싶다면 아래와 같이 “File > Save as”를 선택하여 Workspace로 내보낼 수 있다.


또, 만약 저장해둔 컬러맵을 불러오고 싶다면 “File > Import” 를 누르면 된다.


폰트

사용 폰트 변경

MATLAB R2022b에서 Axis 객체에 사용되는 기본 폰트는 “Helvetica”이지만 “Helvetica”는 한글 문자에 적용할 수 없어 한글 문자에 대한 기본 폰트는 모두 “굴림”으로 적용된다. 그러나 전통적인 “굴림” 폰트는 한글 문자의 가독성이 떨어져 보일 수 있다. 최근 나온 한글 폰트 중 가독성이 좋은 것 중에 하나로 “나눔고딕”을 꼽고 싶다. 아래의 스크립트에서 처럼 “set” 함수를 이용해 특정 Axis 객체에서 사용하는 폰트를 “나눔고딕”으로 바꿀 수 있다.

x = linspace(0,10);
y1 = sin(x);
y2 = sin(x-0.5);
y3 = sin(x-1);
y4 = sin(x-1.5);

figure('position', [136, 363, 1269, 420]);
subplot(1, 2, 1);
plot(x, y1,'LineWidth',2)
hold on
plot(x, y2,'LineWidth',2)
plot(x, y3,'LineWidth',2)
plot(x, y4,'LineWidth',2)
hold off
xlabel('시간')
ylabel('앰플리튜드')

subplot(1,2,2);
plot(x, y1,'LineWidth',2)
hold on
plot(x, y2,'LineWidth',2)
plot(x, y3,'LineWidth',2)
plot(x, y4,'LineWidth',2)
hold off
set(gca,'fontname','NanumGothic')
xlabel('시간')
ylabel('앰플리튜드')


위 그림은 꼭 새 탭에서 열어 크게 확대해서 보자.

참고로 R2022a버전 부터는 “set” 함수를 이용하는 방법 외에도 “fontname”이라는 함수를 사용할 수도 있다.

fontname(gca, 'NanumGothic'); % An alternative for "set(gca,'fontname', 'NanumGothic');"

폰트 크기 변경

폰트의 크기를 변경하기 위해서는 폰트를 바꿀 때와 유사하게 “FontSize” 옵션을 변경해 사용하면 된다.

x = linspace(0,10);
y1 = sin(x);
y2 = sin(x-0.5);
y3 = sin(x-1);
y4 = sin(x-1.5);

figure('position', [136, 363, 1269, 420]);
subplot(1, 2, 1);
plot(x, y1,'LineWidth',2)
hold on
plot(x, y2,'LineWidth',2)
plot(x, y3,'LineWidth',2)
plot(x, y4,'LineWidth',2)
hold off
xlabel('시간')
ylabel('앰플리튜드')

subplot(1,2,2);
plot(x, y1,'LineWidth',2)
hold on
plot(x, y2,'LineWidth',2)
plot(x, y3,'LineWidth',2)
plot(x, y4,'LineWidth',2)
hold off
set(gca, 'fontsize', 15)
xlabel('시간')
ylabel('앰플리튜드')


참고로 R2022a버전 부터는 “set” 함수를 이용하는 방법 외에도 “fontsize”라는 함수를 사용할 수도 있다. 그런데 “fontsize” 함수를 사용하면 특정 폰트 크기를 지정하는 것 외에도 “increase”, “decrease” 같은 상대적인 크기를 조정하는 것이 가능하다.

fontsize(gca, 15, "points") % An alternative for "set(gca, 'fontsize', 15);"
fontsize(gca, "increase") % increase fontsize by a factor of 1.1
fontsize(gca, "decrease") % decrease fontsize by a factor of 0.9
fontsize(gca, scale = sfactor) % scale up or down according to sfactor

수식

MATLAB 그래픽스에 수식을 집어 넣기 위해선 두 가지를 이용해야 하는데 하나는 “text” 함수이고 또 하나는 LaTeX 문법을 이용해 만든 수식용 텍스트이다. “text” 함수의 문법은 아래와 같다.

text(x, y, str);

여기서 “x”와 “y”는 text를 넣고자 하는 현재 axis의 x, y 좌표값이며 “str”은 char형 혹은 string 형의 문자열이다. 문자열에는 두 개의 “$$” 사이에 LaTeX 문법으로 작성된 수식 용 문자열을 작성하면 된다. LaTeX 문법에 관해서는 다음의 문서를 참고하도록 하자.

http://en.wikipedia.org/wiki/Help:Displaying_a_formula#Formatting_using_TeX

그래프 안에 수식 텍스트를 삽입한 예시는 아래와 같다. “text”를 수식용으로 사용하기 위해선 “text” 함수의 “interpreter” 옵션을 “latex”로 설정해야 한다. 이 외에도 폰트 사이즈 등을 수정할 수도 있다.

x = linspace(-3,3,1000);
mu = 0; sigma = 1;
figure;
subplot(2, 1, 1)
plot(x, sin(2*pi*1*x));
eq1 = '$$y = \sin(2\pi x)$$';
text(0.5, 0.2, eq1, 'interpreter','latex','fontsize',12)
xlabel('$$x$$', 'Interpreter','latex')
ylabel('$$y$$', 'Interpreter','latex')
subplot(2, 1, 2);
myfun = @(x, mu, sigma) 1/(sigma * sqrt(2*pi)) * exp(-1/2 * (x-mu).^2 / sigma^2);
plot(x, myfun(x, mu, sigma))
eq2 = '$$y = \frac{1}{\sigma\sqrt{2\pi}}\exp\left(-\frac{1}{2}\left(\frac{x-\mu}{\sigma}\right)^2\right)$$';
text(-0.2, 0.2, eq2,  'interpreter', 'latex', 'fontsize',12)
xlabel('$$x$$', 'Interpreter','latex')
ylabel('$$y$$', 'Interpreter','latex')